import java.applet.Applet;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

@SuppressWarnings("serial")
public class Reloj extends Applet implements Runnable {
	private volatile Thread timer; // los hilos para mostrar el reloj
	private int lastxs, lastys, lastxm, lastym, lastxh, lastyh; // dimensiones
																// para dibujar
																// las manos del
																// reloj
	private SimpleDateFormat formatter; // tipo de formato mostrado del dato
	private String lastdate; // cadena en la cual se muestran los datos del
								// reloj
	private Font clockFaceFont; // fondo para mostrar los numeros del reloj
	private Date currentDate; // usado para devolver el dato para mostrarlo
	private Color handColor; // Color de las manos principales y del dial
	private Color numberColor; // color del secundario y las manos

	public void init() {
		@SuppressWarnings("unused")
		int x, y;
		lastxs = lastys = lastxm = lastym = lastxh = lastyh = 0;
		formatter = new SimpleDateFormat("EEE MMM dd hh:mm:ss yyyy", Locale
				.getDefault());
		currentDate = new Date();
		lastdate = formatter.format(currentDate);
		clockFaceFont = new Font("Serif", Font.PLAIN, 14);
		handColor = Color.blue;
		numberColor = Color.darkGray;

		try {
			setBackground(new Color(Integer.parseInt(getParameter("bgcolor"),
					16)));
		} catch (NullPointerException e) {
		} catch (NumberFormatException e) {
		}
		try {
			handColor = new Color(Integer
					.parseInt(getParameter("fgcolor1"), 16));
		} catch (NullPointerException e) {
		} catch (NumberFormatException e) {
		}
		try {
			numberColor = new Color(Integer.parseInt(getParameter("fgcolor2"),
					16));
		} catch (NullPointerException e) {
		} catch (NumberFormatException e) {
		}
		resize(300, 300); // establece el tamao del reloj en esta ventana
	}

	// mtodo principal del programa
	public void paint(Graphics g) {
		int xh, yh, xm, ym, xs, ys;
		int s = 0, m = 10, h = 10;
		int xcenter = 80, ycenter = 55;
		String today;

		currentDate = new Date();

		formatter.applyPattern("s");
		try {
			s = Integer.parseInt(formatter.format(currentDate));
		} catch (NumberFormatException n) {
			s = 0;
		}
		formatter.applyPattern("m");
		try {
			m = Integer.parseInt(formatter.format(currentDate));
		} catch (NumberFormatException n) {
			m = 10;
		}
		formatter.applyPattern("h");
		try {
			h = Integer.parseInt(formatter.format(currentDate));
		} catch (NumberFormatException n) {
			h = 10;
		}

		// dibuja la posicin de las manos
		xs = (int) (Math.cos(s * Math.PI / 30 - Math.PI / 2) * 45 + xcenter);
		ys = (int) (Math.sin(s * Math.PI / 30 - Math.PI / 2) * 45 + ycenter);
		xm = (int) (Math.cos(m * Math.PI / 30 - Math.PI / 2) * 40 + xcenter);
		ym = (int) (Math.sin(m * Math.PI / 30 - Math.PI / 2) * 40 + ycenter);
		xh = (int) (Math.cos((h * 30 + m / 2) * Math.PI / 180 - Math.PI / 2) * 30 + xcenter);
		yh = (int) (Math.sin((h * 30 + m / 2) * Math.PI / 180 - Math.PI / 2) * 30 + ycenter);

		// dibuja el crculo y los nmeros
		g.setFont(clockFaceFont);
		g.setColor(handColor);
		g.drawArc(xcenter - 50, ycenter - 50, 100, 100, 0, 360);
		g.setColor(numberColor);
		g.drawString("9", xcenter - 45, ycenter + 3);
		g.drawString("3", xcenter + 40, ycenter + 3);
		g.drawString("12", xcenter - 5, ycenter - 37);
		g.drawString("6", xcenter - 3, ycenter + 45);

		// devuelve el dato impreso en el botn
		formatter.applyPattern("EEE MMM dd HH:mm:ss yyyy");
		today = formatter.format(currentDate);

		// mtodos si son necesarios
		g.setColor(getBackground());
		if (xs != lastxs || ys != lastys) {
			g.drawLine(xcenter, ycenter, lastxs, lastys);
			g.drawString(lastdate, 5, 125);
		}
		if (xm != lastxm || ym != lastym) {
			g.drawLine(xcenter, ycenter - 1, lastxm, lastym);
			g.drawLine(xcenter - 1, ycenter, lastxm, lastym);
		}
		if (xh != lastxh || yh != lastyh) {
			g.drawLine(xcenter, ycenter - 1, lastxh, lastyh);
			g.drawLine(xcenter - 1, ycenter, lastxh, lastyh);
		}

		// dibujar dato y las manos del reloj
		g.setColor(numberColor);
		g.drawString(today, 5, 125);
		g.drawLine(xcenter, ycenter, xs, ys);
		g.setColor(handColor);
		g.drawLine(xcenter, ycenter - 1, xm, ym);
		g.drawLine(xcenter - 1, ycenter, xm, ym);
		g.drawLine(xcenter, ycenter - 1, xh, yh);
		g.drawLine(xcenter - 1, ycenter, xh, yh);
		lastxs = xs;
		lastys = ys;
		lastxm = xm;
		lastym = ym;
		lastxh = xh;
		lastyh = yh;
		lastdate = today;
		currentDate = null;
	}

	// mtodo que inicializa el reloj
	public void start() {
		timer = new Thread(this);
		timer.start();
	}

	// mtodos que para el reloj
	public void stop() {
		timer = null;
	}

	// mtodo que hace correr la ejecucin del reloj
	@SuppressWarnings("static-access")
	public void run() {
		Thread me = Thread.currentThread();
		while (timer == me) {
			try {
				Thread.currentThread().sleep(100);
			} catch (InterruptedException e) {
			}
			repaint();
		}
	}

	// mtodo que grfica el reloj
	public void update(Graphics g) {
		paint(g);
	}
}
